<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 断言：非捕获
    *   推断预测，例如前面一定要是什么，后面一定要是什么
    *   (?<=描述的匹配条件) 问号写在括号中的最前面 就是断言的意思 ()括号本来表示捕获 但是里面加上问号? 就是非捕获
    *
    *   例如：(?<=x)y，是前置肯定断言，表示匹配结果y前面一定要是x，但是x不需要捕获，x不会在匹配结果中
    *   又如：y(?=x)，是后置肯定断言，注意里面的箭头符号不见了，表示匹配结果y后面一定要是x，但是x不需要捕获，x不会再匹配结果中
    *
    * */
    let reg = /a\dc/g //匹配"a数字c"这个整体，全局匹配
    let str = "a4ca6c"
    console.log(str.match(reg))
    //如果没有全局匹配，就匹配一次，返回前面的["a4c"];写了全局匹配就是返回["a4c","a6c"]

    //如果要匹配前面是a并且后面是c的中间的那个数字
    //前面是a 后面是c 相当于两个匹配条件 这两个条件需要写出来 但是条件不会捕获到结果中
    let regac = /(?<=a)\d(?=c)/g //匹配前面是a并且后面是c的中间那个数字
    let strac = "a2ca5cs5b"
    console.log(strac.match(regac)) //["2", "5"] 因为后面的那个数字5前面是s后面是b所以不算

    //如果有以下几个文件，我们要获取文件名是mp4结尾的文件
    let str2 = "文件:阿飞.mp4;文件:万章.mp4;文件:云牧.avi"
    let reg2 = /(?<=文件:).*?(?=\.mp4)/ig //".mp4"中的点前面加反斜杠是为了不被解析成任意字符；ig表示模式是不区分大小写与全局匹配
    //匹配前面是文件开头，后面是mp4结尾，中间的那个文件名，因为文件名可以是任意字符连续出现任意次，所以用".*"加?表示非贪婪模式，不然会有问题
    console.log(str2.match(reg2))

    /*
    * 再说说否定断言:等号改成感叹号，就变成否定的意思
    * 前置否定断言：
    *   (?<!x)y，表示匹配结果y前面一定不是x，x不需要捕获，x不会在匹配结果中
    *
    * 后置否定断言：
    *   y(?!x)，表示匹配结果y后面一定不是x，x不需要捕获，x不会在匹配结果中
    *
    * 例子：有一段字符串"银时说牛逼;阿飞说牛逼;万章说牛逼"，只要不是银时说的牛逼，都要匹配到
    *
    * */


</script>
</body>
</html>